import axios from 'axios'

/**
 * 菜鸟教程代码执行服务
 * 通过代理避免CORS问题
 */

// 语言映射，将前端语言标识映射到菜鸟教程的标识
const languageMap = {
  python: 'py',
  java: 'java', 
  cpp: 'cpp',
  php: 'php',
  go: 'go',
  csharp: 'csharp',
  c: 'c'
}

/**
 * 执行代码
 * @param {Object} params - 执行参数
 * @param {string} params.code - 代码内容
 * @param {string} params.language - 编程语言
 * @param {string} params.stdin - 输入内容（可选）
 * @returns {Promise} 返回执行结果
 */
export function executeCodeWithCaiNiaoJiao(params) {
  const { code, language, stdin = '' } = params
  
  // 获取对应的文件扩展名
  const fileext = languageMap[language] || language
  
  // 准备请求数据
  const requestData = {
    stdin: stdin,
    code: code,
    fileext: fileext,
    lan: language,
    token: "f324ef7dbd439fae51a5cc72678bfc4e",  // 写死的token
    tkid: "28480730"  // 写死的tkid
  }

  // 使用代理发送请求避免CORS问题
  return axios.post('/cainiaojc-api/tool/r.php', requestData, {
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    // 将对象转换为URL编码格式
    transformRequest: [function (data) {
      const formData = new URLSearchParams()
      for (const key in data) {
        formData.append(key, data[key])
      }
      return formData.toString()
    }],
    timeout: 30000 // 30秒超时
  }).then(response => {
    // 处理响应结果
    if (response.data && response.data.output !== undefined) {
      return {
        success: true,
        output: response.data.output || "代码执行完成，无输出",
        errors: response.data.errors || null
      }
    } else {
      return {
        success: false,
        error: response.data?.errors || "未知错误",
        output: null
      }
    }
  }).catch(error => {
    // 详细的错误处理
    let errorMessage = "代码执行失败: "
    
    if (error.response) {
      // 服务器响应了错误状态码
      errorMessage += `HTTP ${error.response.status} - ${error.response.statusText}`
    } else if (error.request) {
      // 请求已发送但没有收到响应
      errorMessage += "无法连接到代码执行服务，请检查网络连接"
    } else if (error.code === 'ECONNABORTED') {
      // 超时错误
      errorMessage += "代码执行超时，请稍后重试"
    } else {
      // 其他错误
      errorMessage += error.message
    }
    
    return {
      success: false,
      error: errorMessage,
      output: null
    }
  })
}

/**
 * 批量执行代码（用于测试多个语言）
 * @param {Array} codeList - 代码列表
 * @returns {Promise} 返回批量执行结果
 */
export function batchExecuteCode(codeList) {
  const promises = codeList.map(item => {
    return executeCodeWithCaiNiaoJiao({
      code: item.code,
      language: item.language,
      stdin: item.stdin || ''
    })
  })
  
  return Promise.all(promises)
}

export default {
  executeCodeWithCaiNiaoJiao,
  batchExecuteCode
}